using System;
using CSharpBasicsExamples;
using CSharpBasicsExamples.AOP;
using CSharpBasicsExamples.ValueReferenceTypes;
using CSharpBasicsExamples.DataStructures;

namespace CSharpBasicsExamples
{
    /// <summary>
    /// C# 基础知识演示程序
    /// 包含：多态、AOP、值类型与引用类型、数据结构等示例
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("=== C# 基础知识演示程序 ===");
            Console.WriteLine("请选择要演示的内容：");
            Console.WriteLine("1. 多态(重写)示例");
            Console.WriteLine("2. AOP(面向切面编程)示例");
            Console.WriteLine("3. 值类型与引用类型示例");
            Console.WriteLine("4. 数据结构(数组与链表)示例");
            Console.WriteLine("5. 运行所有示例");
            Console.WriteLine("0. 退出");
            
            while (true)
            {
                Console.Write("\n请输入选项 (0-5): ");
                string input = Console.ReadLine();
                
                switch (input)
                {
                    case "1":
                        RunPolymorphismDemo();
                        break;
                    case "2":
                        RunAOPDemo();
                        break;
                    case "3":
                        RunValueReferenceTypesDemo();
                        break;
                    case "4":
                        RunDataStructuresDemo();
                        break;
                    case "5":
                        RunAllDemos();
                        break;
                    case "0":
                        Console.WriteLine("程序结束，再见！");
                        return;
                    default:
                        Console.WriteLine("无效选项，请重新输入。");
                        continue;
                }
                
                Console.WriteLine("\n按任意键继续...");
                Console.ReadKey();
                Console.Clear();
                
                Console.WriteLine("=== C# 基础知识演示程序 ===");
                Console.WriteLine("请选择要演示的内容：");
                Console.WriteLine("1. 多态(重写)示例");
                Console.WriteLine("2. AOP(面向切面编程)示例");
                Console.WriteLine("3. 值类型与引用类型示例");
                Console.WriteLine("4. 数据结构(数组与链表)示例");
                Console.WriteLine("5. 运行所有示例");
                Console.WriteLine("0. 退出");
            }
        }
        
        /// <summary>
        /// 运行多态演示
        /// </summary>
        private static void RunPolymorphismDemo()
        {
            Console.Clear();
            try
            {
                PolymorphismDemo.RunDemo();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"演示过程中发生错误: {ex.Message}");
            }
        }
        
        /// <summary>
        /// 运行AOP演示
        /// </summary>
        private static void RunAOPDemo()
        {
            Console.Clear();
            try
            {
                AOPDemo.RunDemo();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"演示过程中发生错误: {ex.Message}");
            }
        }
        
        /// <summary>
        /// 运行值类型与引用类型演示
        /// </summary>
        private static void RunValueReferenceTypesDemo()
        {
            Console.Clear();
            try
            {
                ValueReferenceTypesDemo.RunDemo();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"演示过程中发生错误: {ex.Message}");
            }
        }
        
        /// <summary>
        /// 运行数据结构演示
        /// </summary>
        private static void RunDataStructuresDemo()
        {
            Console.Clear();
            try
            {
                DataStructuresDemo.RunDemo();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"演示过程中发生错误: {ex.Message}");
            }
        }
        
        /// <summary>
        /// 运行所有演示
        /// </summary>
        private static void RunAllDemos()
        {
            Console.Clear();
            Console.WriteLine("=== 运行所有演示 ===\n");
            
            try
            {
                // 1. 多态演示
                Console.WriteLine("【1/4】多态(重写)演示");
                Console.WriteLine("".PadRight(50, '='));
                PolymorphismDemo.RunDemo();
                
                Console.WriteLine("\n\n");
                
                // 2. AOP演示
                Console.WriteLine("【2/4】AOP(面向切面编程)演示");
                Console.WriteLine("".PadRight(50, '='));
                AOPDemo.RunDemo();
                
                Console.WriteLine("\n\n");
                
                // 3. 值类型与引用类型演示
                Console.WriteLine("【3/4】值类型与引用类型演示");
                Console.WriteLine("".PadRight(50, '='));
                ValueReferenceTypesDemo.RunDemo();
                
                Console.WriteLine("\n\n");
                
                // 4. 数据结构演示
                Console.WriteLine("【4/4】数据结构(数组与链表)演示");
                Console.WriteLine("".PadRight(50, '='));
                DataStructuresDemo.RunDemo();
                
                Console.WriteLine("\n\n=== 所有演示完成 ===");
                ShowSummary();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"演示过程中发生错误: {ex.Message}");
                Console.WriteLine($"错误详情: {ex.StackTrace}");
            }
        }
        
        /// <summary>
        /// 显示总结信息
        /// </summary>
        private static void ShowSummary()
        {
            Console.WriteLine("\n=== C# 基础知识总结 ===");
            
            Console.WriteLine("\n1. 多态(Polymorphism):");
            Console.WriteLine("   - 允许不同类的对象对同一消息做出不同响应");
            Console.WriteLine("   - 通过虚方法(virtual)和重写(override)实现");
            Console.WriteLine("   - 提高代码的灵活性和扩展性");
            
            Console.WriteLine("\n2. 设计原则:");
            Console.WriteLine("   - 里氏替换原则(LSP): 子类对象必须能够替换基类对象");
            Console.WriteLine("   - 依赖倒置原则(DIP): 依赖抽象而非具体实现");
            
            Console.WriteLine("\n3. AOP(面向切面编程):");
            Console.WriteLine("   - 将横切关注点从业务逻辑中分离");
            Console.WriteLine("   - 常用于日志、安全、事务、缓存等场景");
            Console.WriteLine("   - 提高代码的模块化和可维护性");
            
            Console.WriteLine("\n4. 值类型 vs 引用类型:");
            Console.WriteLine("   - 值类型: 直接存储数据，赋值时复制值");
            Console.WriteLine("   - 引用类型: 存储对象引用，赋值时复制引用");
            Console.WriteLine("   - 装箱拆箱: 值类型与object之间的转换");
            
            Console.WriteLine("\n5. 数据结构:");
            Console.WriteLine("   - 数组: 连续内存，随机访问O(1)，插入删除O(n)");
            Console.WriteLine("   - 链表: 非连续内存，访问O(n)，插入删除O(1)");
            Console.WriteLine("   - 选择依据: 访问模式、操作频率、内存要求");
            
            Console.WriteLine("\n6. 集合类原理:");
            Console.WriteLine("   - List<T>: 泛型动态数组，避免装箱拆箱");
            Console.WriteLine("   - ArrayList: 非泛型，存储object，有装箱开销");
            Console.WriteLine("   - 容量增长: 动态扩容，通常翻倍增长");
            
            Console.WriteLine("\n这些概念是C#开发的基础，掌握它们有助于:");
            Console.WriteLine("✓ 编写高质量、可维护的代码");
            Console.WriteLine("✓ 进行性能优化");
            Console.WriteLine("✓ 理解.NET框架的设计思想");
            Console.WriteLine("✓ 为高级主题学习打下基础");
        }
    }
}
